/*
 * ArbolBPlus.cpp
 */
#include "ArbolBPlus.h"


ArbolBPlus::ArbolBPlus(std::string nomArch, size_t tamBloque, bool crear){
	// Crea el manejador del archivo del arbol
	this->_arch = new TreeFile(nomArch, tamBloque, crear);

	// Crea un buffer en memoria para los datos de los nodos
	char* buffer = new char[tamBloque];
	unsigned long int refRaiz = 0;

	// Si crea un archivo nuevo tengo que crear un nodo raiz nuevo
	if (crear){
		// Crea un nodo en memoria y lo serializa
		//this->_nodoRaiz = new Nodo(...);
		//this->_nodoRaiz->pack(buffer);

		// Guarda el nodo raiz
		refRaiz = this->_arch->getNewBloque();
		this->_arch->storeBloque(refRaiz, buffer);

	} else {
		// Hay que recuperar el nodo Raiz del disco
		refRaiz = this->_arch->getRefBloqueRaiz();
		this->_arch->loadBloque(refRaiz, buffer);

		// Convierte los bytes en un nodo
		//this->_nodoRaiz = new Nodo(buffer);
	}

	// Borra el buffer de datos
	delete[] buffer;
}


ArbolBPlus::~ArbolBPlus() {
	// Si el nodo raiz fue modificado hay que guardarlo
	//if ( this->_nodoRaiz->isDirty() )
	{

		// Se serializan los datos del nodo en un buffer
		char* buffer = new char[this->_arch->getSizeBloque()];
		//this->_nodoRaiz->pack(buffer);

		// Se guardan los datos en disco
		unsigned long int refRaiz = this->_arch->getRefBloqueRaiz();
		this->_arch->storeBloque(refRaiz, buffer);

		delete[] buffer;
	}

	// Cierra el manejador de archivos
	delete this->_arch;
}


RegistroAbstracto* ArbolBPlus::BuscarRegistro(std::string clave){
	// TODO esta funcion llama al buscar del nodo raiz
	return NULL;
}


void ArbolBPlus::agregarRegistro(RegistroAbstracto* reg){
	// TODO esta funcion llama al agregar registro del nodo raiz
}


void ArbolBPlus::eliminarRegistro(std::string clave){
	// TODO esta funcion llama al eliminar registro del nodo raiz
}

